模式设计

您所在的位置:网站首页 greenplum jdbc 模式设计

模式设计

2024-07-10 23:54| 来源: 网络整理| 查看: 265

在创建表时,Greenplum数据库提供了一批存储选项。非常有必要了解何时使用堆存储以及追加优化(AO)存储,还有何时使用面向行的存储以及面向列的存储。在堆和AO以及行和列之间做出正确的选择对于大型的事实表来说极度重要,但是对于小的维度表就不那么重要。

确定存储模型的最佳实践是: 设计并且构建一种只插入的模型,在装载前截断每天的分区。 对于大型的分区事实表,为不同的分区评估并且使用最优的存储选项。一种存储选项对于整个分区表并不总是正确的。例如,有些分区可以是行存的而其他分区是列存的。 在使用面向列的存储时,每一列在每个Greenplum数据库Segment上都是一个单独的文件。对于具有大量列的表,对经常访问的数据(热数据)考虑列存,对不经常访问的数据(冷数据)考虑面向行的存储。 存储选项应该在分区级别或者数据被存储的级别设置。 如果需要,压缩大型表以提升I/O性能并且在集群中腾出空间。 堆存储还是追加优化存储

堆存储是默认模型,并且是PostgreSQL为所有数据库表使用的模型。为将收到反复UPDATE、DELETE以及单个INSERT操作的表和分区使用堆存储。为将收到并发UPDATE、DELETE以及INSERT操作的表和分区使用堆存储。

为初始装载后就很少被更新并且后续只会以批操作执行插入的表和分区使用追加优化存储。绝不要在追加优化表上执行单个INSERT、UPDATE或者DELETE操作。并发的批量INSERT操作可以被执行但是绝不执行并发的批量UPDATE或者DELETE操作。

追加优化表中被更新和删除的行所占用的空间不会像堆表那样被有效地回收及重用,因此追加优化存储模型不适合于频繁更新的表。它的设计目标是用于一次装载、很少更新且频繁进行分析查询处理的大型表。

行存还是列存

行方向是传统的存储数据库元组的方式。组成一行的列被连续地存储在磁盘上,因此整个行可以被以单次I/O从磁盘上读出。

面向列的方式把列值在磁盘上存在一起。对每一列都会创建一个单独的文件。如果表被分区,则会对每个列和分区的组合创建一个单独的文件。当一个查询在一个有很多列的列存表中访问少量列时,I/O代价会比行存表要减少很多,因为不必从磁盘上检索没有被引用的列。

对于包含要求更新并且频繁执行插入的事务的交易型负载,推荐使用面向行的存储。当对表的选择很宽(即查询中需要单个行的很多列)时,应该使用面向行的存储。如果大部分列出现在查询的SELECT列表或者WHERE子句中,请使用面向行的存储。对一般目的或者混合负载使用面向行的存储,因为它能提供灵活性和性能的最佳组合。

面向列的存储是为了读操作而优化,但它并未对写操作优化,一行的列值必须被写入到磁盘上的不同位置。对于有很多列的大型表,当查询中只访问列的一个小集合时,列存表可以提供最优查询性能。

列存的另一个好处是,同一种数据类型的值集合可以用比混合类型值集合更少的空间存储在一起,因此列存表比行存表使用的磁盘空间更少(进而导致需要更少的磁盘I/O)。列存表的压缩效果也比行存表更好。

对于数据仓库的分析型负载,其中的选择很窄或者在少量列上计算数据聚集,请使用面向列的存储。对于定期更新单个列但不修改行中其他列的表,使用面向列的存储。在一个很宽的列存表中读取一个完整的行比在行存表中读取同样一行需要更多时间。有必要理解每个列都是Greenplum数据库中每个Segment上一个单独的物理文件。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3